문제

나는 묶으려고 노력하고있다 DependancyProperty 내 우르 컨트롤 중 하나에서 Width a의 속성 Column 안에 Grid.

나는 이것과 유사한 코드를 가지고 있습니다.

<Grid x:Name="MyGridName">
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="TitleSection" Width="100" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>...</Grid.RowDefinitions>

    <GridSplitter x:Name="MyGridSplitter" Grid.Row="0" Grid.Column="0" ... />
</Grid>

별도의 USERCONTROL에는 다음이 있습니다DependancyProperty 한정된.

public static readonly DependencyProperty TitleWidthProperty = DependencyProperty.Register("TitleWidth", typeof(int), typeof(MyUserControl));

public int TitleWidth
{
    get { return (int)base.GetValue(TitleWidthProperty); }
    set { base.SetValue(TitleWidthProperty, value); }
}

코드에서 USERCONTROL 인스턴스를 만들고 있으므로 다음과 비슷한 바인딩 진술이 있습니다.

MyUserControl Cntrl = new MyUserControl(/* Construction Params */);
BindingOperations.SetBinding(Cntrl , MyUserControl.AnotherProperty, new Binding { ElementName = "objZoomSlider", Path = new PropertyPath("Value"), Mode = BindingMode.OneWay });
BindingOperations.SetBinding(Cntrl , MyUserControl.TitleWidthProperty, new Binding { ElementName = "TitleSection", Path = new PropertyPath("ActualWidth"), Mode = BindingMode.OneWay });
/* Other operations on Cntrl */

첫 번째 바인딩 정의는 실제 UIelement (이 경우 슬라이더)에 바인딩되지만 "타이틀 섹션"(그리드에 정의 된 열 정의)에 대한 바인딩은 실패하지만 환상적으로 작동합니다. 코드에 중단 점을 넣고 "타이틀 섹션"에서 시계를 수행하면 예상되는 객체가 반환됩니다.

나는 Ax : Name'd ColumnDefinition에 구속 될 수 없다고 의심하기 시작했습니다. 누구든지 그리드에서 첫 번째 열의 변화하는 너비에 어떻게 결합 할 수 있는지 제안 할 수 있습니까?

#1 편집 - 주석에 답하십시오

Databinding은 '실패' TitleWidth 속성 및 그리드 플리터 컨트롤을 사용하여 첫 번째 열 크기를 조정하면 중단 점이 적용되지 않습니다. 또한 Code는 PrevenancyProperty가 발생할 때 해고 될 것으로 예상됩니다. TitleWidth 변경 사항은 실행되지 않습니다.

Usercontrol이 생성되고 그리드 내의 스택 패널에 추가됩니다. Window_Loaded 기능. Usercontrols가 구성 될 때까지 그리드가 렌더링되었을 것으로 기대합니다. 확실히 X : 이름이 요소입니다 TitleSection 시청할 수 있고 가치가 있습니다 100 그들이 건설 될 때 / 결합이 일어나기 전에.

#2 편집 - 아마도 이것과 관련이 있습니까?

그리드 칼럼 정의 문서를 위해 MSDN 페이지를 스니핑하고 있습니다. gridlength () 그러나 나는 바인딩 표현에서 이것을 어떻게 사용할 수 있는지에 대한 머리를 잡을 수 없습니다. 관련 그리드 길이 콘버터를 IvalueConverter에서 파생되지 않기 때문에 바인딩 코드의 변환기로 사용할 수 없습니다.

나는 그리드 객체의 셀 중 하나의 실제 전체 속성에 어떻게 든 결합하고 있습니다. 열 정의에 바인딩하는 것만 큼 깨끗하지는 않지만 현재는 그렇게 할 수 없습니다.

도움이 되었습니까?

해결책

글쎄, 나는 약간의 kludge 일을했고, 미래 세대를위한 방법을 설명하겠습니다.

기본적으로 첫 번째 열에 스플리터가 오른쪽으로 정렬 된 스플리터가있는 2 열, 멀티 행 그리드가있어서 포함 된 콘텐츠에 더 많은 공간이 필요한 경우 사용자가 크기를 조정할 수 있습니다. 복잡한 것을 복잡하게하려면 렌더링 목적 (한 셀에서 다음 셀에서 다음 셀로 내용 '블리드')을 갖는 열 중 일부에 프로그래밍 방식으로 사용자 컨트롤을로드하고 있습니다.

첫 번째 열이 크기 조정되면 USERCONTROL에 반영되어야합니다. 먼저 나는 칼럼 정의에 바인딩을 시도했지만 실제로는 공을 재생하지 않았다.

내가 어떻게 고정/Kludged를했는지

첫 번째 열의 여분 셀에서 나는 <Label> X : 액세스 할 수 있도록 이름. 셀에서와 같이 '스트레치'의 기본 특성을 가지며 셀을 완전히 채 웁니다. 스플리터를 사용하여 열이 크기가 커지면 크기가 조정됩니다. 라벨에 바인딩 ActualWidth 속성은 열의 크기에 대한 변경이 내 열의 SpependancyProperty에 통신된다는 것을 의미합니다.

생각

분명히, ColumnDefinition에도 불구하고 ActualWidth 속성이 변경 될 때는 발사되지 않는 것처럼 보입니다. PropertyChanged 내부적으로 이벤트 (또는 그게 내 최선의 추측). 이것은 버그 일 수도 있고 디자인에 의한 것일 수 있지만, 저에게는 덜 깨끗한 솔루션을 사용해야한다는 의미입니다.

다른 팁

XAML로 바인딩을 설정해 보셨습니까? 다음이 효과가 있어야합니다.

<ColumnDefinition 
    x:Name="TitleSection" 
    Width="{Binding 
                Path=TitleWidth, 
                RelativeSource={RelativeSource AncestorType=MyUserControl}}" 
    />

그렇지 않으면, 당신이 제공 한 바인딩 코드를 보면, 그것은 나에게 잘못된 길을 보게되며, 바인딩의 목표는 그리드 열이어야하고 소스는 종속성 속성이어야합니다.

위의 XAML에 대한 동등한 코드는 다음과 같습니다

BindingOperations.SetBinding(TitleSection, ColumnDefinition.WidthProperty,
    new Binding()
    {
        RelativeSource= new RelativeSource(RelativeSourceMode.FindAncestor, typeof(MyUserControl),1),
        Path = new PropertyPath("TitleWidth"),
    });

관련 메모에서, 그리드 플리터를 사용하고 폭을 바인딩하는 것은 서로 배타적입니다. 스플리터를 사용하여 열을 조정하자마자 바인딩은 스플리터의 값으로 대체됩니다.

이것은 바인딩의 대상 인 속성을 업데이트하여 경험하는 것과 유사합니다. 코드에서 대상 값을 직접 설정하면 바인딩 객체를 공급 값으로 교체하는 것입니다.

ColumnDefinition.width는 정수가 아닙니다. 그리드 길이를 정수에 직접 바인딩 할 수 없으며 변환기가 필요합니다.

이것이 바로 컨트롤의 너비 속성 (이중)을 변환기없이 칼럼 정의의 너비 속성 (gridlength)에 바인딩 할 수없는 이유입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top